{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "557a6223",
   "metadata": {},
   "source": [
    "# DAY33 \n",
    "默认大家已经有一定的神经网络基础，该部分已经在复试班的深度学习部分介绍完毕，如果没有，你需要自行了解下MLP的概念。\n",
    "\n",
    "你需要知道\n",
    "1. 梯度下降的思想\n",
    "2. 激活函数的作用\n",
    "3. 损失函数的作用\n",
    "4. 优化器\n",
    "5. 神经网络的概念\n",
    "\n",
    "神经网络由于内部比较灵活，所以封装的比较浅，可以对模型做非常多的改进，而不像机器学习三行代码固定。\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e211c30a",
   "metadata": {},
   "source": [
    "## PyTorch的安装"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "894e6c29",
   "metadata": {},
   "source": [
    "我们后续完成深度学习项目中，主要使用的包为pytorch，所以需要安装，你需要去配置一个新的环境。\n",
    "\n",
    "未来在复现具体项目时候，新环境命名最好是python版本_pytorch版本_cuda版本，例如 py3.10_pytorch2.0_cuda12.2 ,因为复杂项目对运行环境有要求，所以需要安装对应版本的包。\n",
    "\n",
    "我们目前主要不用这么严格，先创建一个命名为DL的新环境即可,也可以沿用之前的环境\n",
    "``` \n",
    "conda create -n DL python=3.8\n",
    "conda env list \n",
    "conda activate DL\n",
    "conda install jupyter （如果conda无法安装jupyter就参考环境配置文档的pip安装方法）\n",
    "pip insatll scikit-learn\n",
    "然后对着下列教程安装pytorch\n",
    "\n",
    "\n",
    "```\n",
    "深度学习主要是简单的并行计算，所以gpu优势更大，简单的计算cpu发挥不出来他的价值，我们之前说过显卡和cpu的区别：\n",
    "1. cpu是1个博士生，能够完成复杂的计算，串行能力强。\n",
    "2. gpu是100个小学生，能够完成简单的计算，人多计算的快。\n",
    "\n",
    "这里的gpu指的是英伟达的显卡，它支持cuda可以提高并行计算的能力。\n",
    "\n",
    "如果你是amd的显卡、苹果的电脑，那样就不需要安装cuda了，直接安装pytorch-gpu版本即可。cuda只支持nvidia的显卡。\n",
    "\n",
    "[安装教程](https://blog.csdn.net/Little_Carter/article/details/135934842?ops_request_misc=%257B%2522request%255Fid%2522%253A%25226f4f98b061723def7702948a6b9272a7%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=6f4f98b061723def7702948a6b9272a7&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-135934842-null-null.142^v101^pc_search_result_base9&utm_term=pytorch%E5%AE%89%E8%A3%85&spm=1018.2226.3001.4187)\n",
    "\n",
    "\n",
    "或者去b站随便搜个pytorch安装视频。\n",
    "1. 怕麻烦直接安装cpu版本的pytorch，跑通了用云服务器版本的pytorch-gpu\n",
    "2. gpu的pytorch还需要额外安装cuda cudnn组件\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3dd5fae",
   "metadata": {},
   "source": [
    "## 准备工作\n",
    "\n",
    "\n"
   ]
  },
  {
   "attachments": {
    "image-2.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "id": "21d65fc9",
   "metadata": {},
   "source": [
    "可以在你电脑的cmd中输入nvidia-smi来查看下显卡信息\n",
    "\n",
    "![image-2.png](attachment:image-2.png)\n",
    "\n",
    "其中最重要的2个信息，分别是：\n",
    "1. 显卡目前驱动下最高支持的cuda版本，12.7\n",
    "2. 显存大小，12288 MiB ÷ 1024 = 12 \n",
    "\n",
    "PS:之所以输入这个命令，可以弹出这些信息，是因为为系统正确安装了 NVIDIA 显卡驱动程序，并且相关路径被添加到了环境变量中。如果你不是英伟达的显卡，自然无法使用这个命令。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "64d3a05a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<module 'torch.cuda' from 'd:\\\\Anaconda\\\\envs\\\\yolov5\\\\lib\\\\site-packages\\\\torch\\\\cuda\\\\__init__.py'>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "torch.cuda"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5a22a731",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CUDA可用！\n",
      "可用的CUDA设备数量: 1\n",
      "当前使用的CUDA设备索引: 0\n",
      "当前CUDA设备的名称: NVIDIA GeForce RTX 3080 Ti\n",
      "CUDA版本: 11.1\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "\n",
    "# 检查CUDA是否可用\n",
    "if torch.cuda.is_available():\n",
    "    print(\"CUDA可用！\")\n",
    "    # 获取可用的CUDA设备数量\n",
    "    device_count = torch.cuda.device_count()\n",
    "    print(f\"可用的CUDA设备数量: {device_count}\")\n",
    "    # 获取当前使用的CUDA设备索引\n",
    "    current_device = torch.cuda.current_device()\n",
    "    print(f\"当前使用的CUDA设备索引: {current_device}\")\n",
    "    # 获取当前CUDA设备的名称\n",
    "    device_name = torch.cuda.get_device_name(current_device)\n",
    "    print(f\"当前CUDA设备的名称: {device_name}\")\n",
    "    # 获取CUDA版本\n",
    "    cuda_version = torch.version.cuda\n",
    "    print(f\"CUDA版本: {cuda_version}\")\n",
    "else:\n",
    "    print(\"CUDA不可用。\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "749f7d69",
   "metadata": {},
   "source": [
    "这里的cuda版本是实际安装的cuda驱动的版本，需要小于显卡所支持的最高版本"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "659102c0",
   "metadata": {},
   "source": [
    "上述这段代码，可以以后不断复用，检查是否有pytorch及cuda相关信息，我们今天先用cpu训练，不必在意，有没有cuda不影响。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf0d3fdf",
   "metadata": {},
   "source": [
    "## 数据的准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a7be54d3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(120, 4)\n",
      "(120,)\n",
      "(30, 4)\n",
      "(30,)\n"
     ]
    }
   ],
   "source": [
    "# 仍然用4特征，3分类的鸢尾花数据集作为我们今天的数据集\n",
    "from sklearn.datasets import load_iris\n",
    "from sklearn.model_selection import train_test_split\n",
    "import numpy as np\n",
    "\n",
    "# 加载鸢尾花数据集\n",
    "iris = load_iris()\n",
    "X = iris.data  # 特征数据\n",
    "y = iris.target  # 标签数据\n",
    "# 划分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 打印下尺寸\n",
    "print(X_train.shape)\n",
    "print(y_train.shape)\n",
    "print(X_test.shape)\n",
    "print(y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2cc9de9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 归一化数据，神经网络对于输入数据的尺寸敏感，归一化是最常见的处理方式\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "scaler = MinMaxScaler()\n",
    "X_train = scaler.fit_transform(X_train)\n",
    "X_test = scaler.transform(X_test) #确保训练集和测试集是相同的缩放"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "01958d56",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将数据转换为 PyTorch 张量，因为 PyTorch 使用张量进行训练\n",
    "# y_train和y_test是整数，所以需要转化为long类型，如果是float32，会输出1.0 0.0\n",
    "X_train = torch.FloatTensor(X_train)\n",
    "y_train = torch.LongTensor(y_train)\n",
    "X_test = torch.FloatTensor(X_test)\n",
    "y_test = torch.LongTensor(y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "618e4b6a",
   "metadata": {},
   "source": [
    "## 模型架构定义\n",
    "\n",
    "定义一个简单的全连接神经网络模型，包含一个输入层、一个隐藏层和一个输出层。\n",
    "\n",
    "定义层数+定义前向传播顺序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "68021396",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "af9b09f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "class MLP(nn.Module): # 定义一个多层感知机（MLP）模型，继承父类nn.Module\n",
    "    def __init__(self): # 初始化函数\n",
    "        super(MLP, self).__init__() # 调用父类的初始化函数\n",
    " # 前三行是八股文，后面的是自定义的\n",
    "\n",
    "        self.fc1 = nn.Linear(4, 10)  # 输入层到隐藏层\n",
    "        self.relu = nn.ReLU()\n",
    "        self.fc2 = nn.Linear(10, 3)  # 隐藏层到输出层\n",
    "# 输出层不需要激活函数，因为后面会用到交叉熵函数cross_entropy，交叉熵函数内部有softmax函数，会把输出转化为概率\n",
    "\n",
    "    def forward(self, x):\n",
    "        out = self.fc1(x)\n",
    "        out = self.relu(out)\n",
    "        out = self.fc2(out)\n",
    "        return out\n",
    "\n",
    "# 实例化模型\n",
    "model = MLP()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "05bc115c",
   "metadata": {},
   "source": [
    "其实模型层的写法有很多，relu也可以不写，在后面前向传播的时候计算下即可，因为relu其实不算一个层，只是个计算而已。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e4fdbac6",
   "metadata": {},
   "outputs": [],
   "source": [
    "    # def forward(self,x): #前向传播\n",
    "    #     x=torch.relu(self.fc1(x)) #激活函数\n",
    "    #     x=self.fc2(x) #输出层不需要激活函数，因为后面会用到交叉熵函数cross_entropy\n",
    "    #     return x"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c77c0846",
   "metadata": {},
   "source": [
    "## 模型训练（CPU版本）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6240b46d",
   "metadata": {},
   "source": [
    "### 定义损失函数和优化器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "25b93063",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分类问题使用交叉熵损失函数\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "\n",
    "# 使用随机梯度下降优化器\n",
    "optimizer = optim.SGD(model.parameters(), lr=0.01)\n",
    "\n",
    "# # 使用自适应学习率的化器\n",
    "# optimizer = optim.Adam(model.parameters(), lr=0.001)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "40746e87",
   "metadata": {},
   "source": [
    "### 开始循环训练\n",
    "\n",
    "实际上在训练的时候，可以同时观察每个epoch训练完后测试集的表现：测试集的loss和准确度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "e0abf37d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch [100/20000], Loss: 1.0730\n",
      "Epoch [200/20000], Loss: 1.0258\n",
      "Epoch [300/20000], Loss: 0.9757\n",
      "Epoch [400/20000], Loss: 0.9200\n",
      "Epoch [500/20000], Loss: 0.8577\n",
      "Epoch [600/20000], Loss: 0.7908\n",
      "Epoch [700/20000], Loss: 0.7247\n",
      "Epoch [800/20000], Loss: 0.6639\n",
      "Epoch [900/20000], Loss: 0.6109\n",
      "Epoch [1000/20000], Loss: 0.5661\n",
      "Epoch [1100/20000], Loss: 0.5285\n",
      "Epoch [1200/20000], Loss: 0.4967\n",
      "Epoch [1300/20000], Loss: 0.4695\n",
      "Epoch [1400/20000], Loss: 0.4456\n",
      "Epoch [1500/20000], Loss: 0.4244\n",
      "Epoch [1600/20000], Loss: 0.4052\n",
      "Epoch [1700/20000], Loss: 0.3877\n",
      "Epoch [1800/20000], Loss: 0.3715\n",
      "Epoch [1900/20000], Loss: 0.3564\n",
      "Epoch [2000/20000], Loss: 0.3423\n",
      "Epoch [2100/20000], Loss: 0.3290\n",
      "Epoch [2200/20000], Loss: 0.3165\n",
      "Epoch [2300/20000], Loss: 0.3046\n",
      "Epoch [2400/20000], Loss: 0.2935\n",
      "Epoch [2500/20000], Loss: 0.2829\n",
      "Epoch [2600/20000], Loss: 0.2729\n",
      "Epoch [2700/20000], Loss: 0.2635\n",
      "Epoch [2800/20000], Loss: 0.2545\n",
      "Epoch [2900/20000], Loss: 0.2461\n",
      "Epoch [3000/20000], Loss: 0.2381\n",
      "Epoch [3100/20000], Loss: 0.2306\n",
      "Epoch [3200/20000], Loss: 0.2235\n",
      "Epoch [3300/20000], Loss: 0.2168\n",
      "Epoch [3400/20000], Loss: 0.2104\n",
      "Epoch [3500/20000], Loss: 0.2044\n",
      "Epoch [3600/20000], Loss: 0.1987\n",
      "Epoch [3700/20000], Loss: 0.1933\n",
      "Epoch [3800/20000], Loss: 0.1882\n",
      "Epoch [3900/20000], Loss: 0.1833\n",
      "Epoch [4000/20000], Loss: 0.1787\n",
      "Epoch [4100/20000], Loss: 0.1744\n",
      "Epoch [4200/20000], Loss: 0.1702\n",
      "Epoch [4300/20000], Loss: 0.1663\n",
      "Epoch [4400/20000], Loss: 0.1625\n",
      "Epoch [4500/20000], Loss: 0.1590\n",
      "Epoch [4600/20000], Loss: 0.1556\n",
      "Epoch [4700/20000], Loss: 0.1523\n",
      "Epoch [4800/20000], Loss: 0.1492\n",
      "Epoch [4900/20000], Loss: 0.1463\n",
      "Epoch [5000/20000], Loss: 0.1435\n",
      "Epoch [5100/20000], Loss: 0.1408\n",
      "Epoch [5200/20000], Loss: 0.1382\n",
      "Epoch [5300/20000], Loss: 0.1358\n",
      "Epoch [5400/20000], Loss: 0.1334\n",
      "Epoch [5500/20000], Loss: 0.1312\n",
      "Epoch [5600/20000], Loss: 0.1290\n",
      "Epoch [5700/20000], Loss: 0.1269\n",
      "Epoch [5800/20000], Loss: 0.1249\n",
      "Epoch [5900/20000], Loss: 0.1230\n",
      "Epoch [6000/20000], Loss: 0.1212\n",
      "Epoch [6100/20000], Loss: 0.1194\n",
      "Epoch [6200/20000], Loss: 0.1177\n",
      "Epoch [6300/20000], Loss: 0.1161\n",
      "Epoch [6400/20000], Loss: 0.1145\n",
      "Epoch [6500/20000], Loss: 0.1130\n",
      "Epoch [6600/20000], Loss: 0.1116\n",
      "Epoch [6700/20000], Loss: 0.1102\n",
      "Epoch [6800/20000], Loss: 0.1088\n",
      "Epoch [6900/20000], Loss: 0.1075\n",
      "Epoch [7000/20000], Loss: 0.1062\n",
      "Epoch [7100/20000], Loss: 0.1050\n",
      "Epoch [7200/20000], Loss: 0.1038\n",
      "Epoch [7300/20000], Loss: 0.1027\n",
      "Epoch [7400/20000], Loss: 0.1016\n",
      "Epoch [7500/20000], Loss: 0.1005\n",
      "Epoch [7600/20000], Loss: 0.0995\n",
      "Epoch [7700/20000], Loss: 0.0985\n",
      "Epoch [7800/20000], Loss: 0.0975\n",
      "Epoch [7900/20000], Loss: 0.0966\n",
      "Epoch [8000/20000], Loss: 0.0957\n",
      "Epoch [8100/20000], Loss: 0.0948\n",
      "Epoch [8200/20000], Loss: 0.0940\n",
      "Epoch [8300/20000], Loss: 0.0932\n",
      "Epoch [8400/20000], Loss: 0.0924\n",
      "Epoch [8500/20000], Loss: 0.0916\n",
      "Epoch [8600/20000], Loss: 0.0908\n",
      "Epoch [8700/20000], Loss: 0.0901\n",
      "Epoch [8800/20000], Loss: 0.0894\n",
      "Epoch [8900/20000], Loss: 0.0887\n",
      "Epoch [9000/20000], Loss: 0.0880\n",
      "Epoch [9100/20000], Loss: 0.0874\n",
      "Epoch [9200/20000], Loss: 0.0867\n",
      "Epoch [9300/20000], Loss: 0.0861\n",
      "Epoch [9400/20000], Loss: 0.0855\n",
      "Epoch [9500/20000], Loss: 0.0849\n",
      "Epoch [9600/20000], Loss: 0.0844\n",
      "Epoch [9700/20000], Loss: 0.0838\n",
      "Epoch [9800/20000], Loss: 0.0833\n",
      "Epoch [9900/20000], Loss: 0.0827\n",
      "Epoch [10000/20000], Loss: 0.0822\n",
      "Epoch [10100/20000], Loss: 0.0817\n",
      "Epoch [10200/20000], Loss: 0.0812\n",
      "Epoch [10300/20000], Loss: 0.0808\n",
      "Epoch [10400/20000], Loss: 0.0803\n",
      "Epoch [10500/20000], Loss: 0.0798\n",
      "Epoch [10600/20000], Loss: 0.0794\n",
      "Epoch [10700/20000], Loss: 0.0790\n",
      "Epoch [10800/20000], Loss: 0.0785\n",
      "Epoch [10900/20000], Loss: 0.0781\n",
      "Epoch [11000/20000], Loss: 0.0777\n",
      "Epoch [11100/20000], Loss: 0.0773\n",
      "Epoch [11200/20000], Loss: 0.0769\n",
      "Epoch [11300/20000], Loss: 0.0766\n",
      "Epoch [11400/20000], Loss: 0.0762\n",
      "Epoch [11500/20000], Loss: 0.0758\n",
      "Epoch [11600/20000], Loss: 0.0755\n",
      "Epoch [11700/20000], Loss: 0.0751\n",
      "Epoch [11800/20000], Loss: 0.0748\n",
      "Epoch [11900/20000], Loss: 0.0745\n",
      "Epoch [12000/20000], Loss: 0.0741\n",
      "Epoch [12100/20000], Loss: 0.0738\n",
      "Epoch [12200/20000], Loss: 0.0735\n",
      "Epoch [12300/20000], Loss: 0.0732\n",
      "Epoch [12400/20000], Loss: 0.0729\n",
      "Epoch [12500/20000], Loss: 0.0726\n",
      "Epoch [12600/20000], Loss: 0.0723\n",
      "Epoch [12700/20000], Loss: 0.0721\n",
      "Epoch [12800/20000], Loss: 0.0718\n",
      "Epoch [12900/20000], Loss: 0.0715\n",
      "Epoch [13000/20000], Loss: 0.0712\n",
      "Epoch [13100/20000], Loss: 0.0710\n",
      "Epoch [13200/20000], Loss: 0.0707\n",
      "Epoch [13300/20000], Loss: 0.0705\n",
      "Epoch [13400/20000], Loss: 0.0702\n",
      "Epoch [13500/20000], Loss: 0.0700\n",
      "Epoch [13600/20000], Loss: 0.0698\n",
      "Epoch [13700/20000], Loss: 0.0695\n",
      "Epoch [13800/20000], Loss: 0.0693\n",
      "Epoch [13900/20000], Loss: 0.0691\n",
      "Epoch [14000/20000], Loss: 0.0688\n",
      "Epoch [14100/20000], Loss: 0.0686\n",
      "Epoch [14200/20000], Loss: 0.0684\n",
      "Epoch [14300/20000], Loss: 0.0682\n",
      "Epoch [14400/20000], Loss: 0.0680\n",
      "Epoch [14500/20000], Loss: 0.0678\n",
      "Epoch [14600/20000], Loss: 0.0676\n",
      "Epoch [14700/20000], Loss: 0.0674\n",
      "Epoch [14800/20000], Loss: 0.0672\n",
      "Epoch [14900/20000], Loss: 0.0670\n",
      "Epoch [15000/20000], Loss: 0.0668\n",
      "Epoch [15100/20000], Loss: 0.0667\n",
      "Epoch [15200/20000], Loss: 0.0665\n",
      "Epoch [15300/20000], Loss: 0.0663\n",
      "Epoch [15400/20000], Loss: 0.0661\n",
      "Epoch [15500/20000], Loss: 0.0659\n",
      "Epoch [15600/20000], Loss: 0.0658\n",
      "Epoch [15700/20000], Loss: 0.0656\n",
      "Epoch [15800/20000], Loss: 0.0654\n",
      "Epoch [15900/20000], Loss: 0.0653\n",
      "Epoch [16000/20000], Loss: 0.0651\n",
      "Epoch [16100/20000], Loss: 0.0650\n",
      "Epoch [16200/20000], Loss: 0.0648\n",
      "Epoch [16300/20000], Loss: 0.0647\n",
      "Epoch [16400/20000], Loss: 0.0645\n",
      "Epoch [16500/20000], Loss: 0.0644\n",
      "Epoch [16600/20000], Loss: 0.0642\n",
      "Epoch [16700/20000], Loss: 0.0641\n",
      "Epoch [16800/20000], Loss: 0.0639\n",
      "Epoch [16900/20000], Loss: 0.0638\n",
      "Epoch [17000/20000], Loss: 0.0637\n",
      "Epoch [17100/20000], Loss: 0.0635\n",
      "Epoch [17200/20000], Loss: 0.0634\n",
      "Epoch [17300/20000], Loss: 0.0633\n",
      "Epoch [17400/20000], Loss: 0.0631\n",
      "Epoch [17500/20000], Loss: 0.0630\n",
      "Epoch [17600/20000], Loss: 0.0629\n",
      "Epoch [17700/20000], Loss: 0.0627\n",
      "Epoch [17800/20000], Loss: 0.0626\n",
      "Epoch [17900/20000], Loss: 0.0625\n",
      "Epoch [18000/20000], Loss: 0.0624\n",
      "Epoch [18100/20000], Loss: 0.0623\n",
      "Epoch [18200/20000], Loss: 0.0621\n",
      "Epoch [18300/20000], Loss: 0.0620\n",
      "Epoch [18400/20000], Loss: 0.0619\n",
      "Epoch [18500/20000], Loss: 0.0618\n",
      "Epoch [18600/20000], Loss: 0.0617\n",
      "Epoch [18700/20000], Loss: 0.0616\n",
      "Epoch [18800/20000], Loss: 0.0615\n",
      "Epoch [18900/20000], Loss: 0.0614\n",
      "Epoch [19000/20000], Loss: 0.0613\n",
      "Epoch [19100/20000], Loss: 0.0612\n",
      "Epoch [19200/20000], Loss: 0.0610\n",
      "Epoch [19300/20000], Loss: 0.0609\n",
      "Epoch [19400/20000], Loss: 0.0608\n",
      "Epoch [19500/20000], Loss: 0.0607\n",
      "Epoch [19600/20000], Loss: 0.0606\n",
      "Epoch [19700/20000], Loss: 0.0605\n",
      "Epoch [19800/20000], Loss: 0.0605\n",
      "Epoch [19900/20000], Loss: 0.0604\n",
      "Epoch [20000/20000], Loss: 0.0603\n"
     ]
    }
   ],
   "source": [
    "# 训练模型\n",
    "num_epochs = 20000 # 训练的轮数\n",
    "\n",
    "# 用于存储每个 epoch 的损失值\n",
    "losses = []\n",
    "\n",
    "for epoch in range(num_epochs): # range是从0开始，所以epoch是从0开始\n",
    "    # 前向传播\n",
    "    outputs = model.forward(X_train)   # 显式调用forward函数\n",
    "    # outputs = model(X_train)  # 常见写法隐式调用forward函数，其实是用了model类的__call__方法\n",
    "    loss = criterion(outputs, y_train) # output是模型预测值，y_train是真实标签\n",
    "\n",
    "    # 反向传播和优化\n",
    "    optimizer.zero_grad() #梯度清零，因为PyTorch会累积梯度，所以每次迭代需要清零，梯度累计是那种小的bitchsize模拟大的bitchsize\n",
    "    loss.backward() # 反向传播计算梯度\n",
    "    optimizer.step() # 更新参数\n",
    "\n",
    "    # 记录损失值\n",
    "    losses.append(loss.item())\n",
    "\n",
    "    # 打印训练信息\n",
    "    if (epoch + 1) % 100 == 0: # range是从0开始，所以epoch+1是从当前epoch开始，每100个epoch打印一次\n",
    "        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "883ec975",
   "metadata": {},
   "source": [
    "如果你重新运行上面这段训练循环，模型参数、优化器状态和梯度会继续保留，导致训练结果叠加，模型参数和优化器状态（如动量、学习率等）不会被重置。这会导致训练从之前的状态继续，而不是从头开始"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d11ac5d",
   "metadata": {},
   "source": [
    "### 可视化结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "1220a3b5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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t8fKlSudvXmYO3duvdo7deokLa+ursb06dMRGhqKgIAAjB07Fvn5+R6xbTbx8fH1tlGhUGD69OkAPG//ff/99xg5ciRiYmKgUCiwdu1au+VCCMyePRvR0dHw9fVFWloajhw5YtenqKgIEyZMgF6vR1BQEO69916Ul5fb9fntt98wcOBA6HQ6xMbG4qWXXqpXy6effopOnTpBp9Ph6quvxvr16526fSaTCU8++SSuvvpq+Pv7IyYmBhMnTsTp06ftXqOhff7CCy+4xfZdbhsBYPLkyfXqHzZsmF0fT92HABr896hQKLBo0SKpjzvvw6Z8Lrjyb6dDPk8Ftdjq1auFRqMRy5cvFwcOHBD33XefCAoKEvn5+XKXVs/QoUPFihUrxP79+0VGRoa4+eabRbt27UR5ebnUZ9CgQeK+++4Tubm50qOkpERaXltbK5KTk0VaWprYu3evWL9+vQgLCxOzZs2S+hw/flz4+fmJmTNnij/++EO8+eabQqVSiY0bNzp1++bMmSO6du1qV/uZM2ek5Q888ICIjY0VW7duFbt27RLXXHONuPbaaz1i22wKCgrstm/z5s0CgNi2bZsQwvP23/r168XTTz8tPv/8cwFAfPHFF3bLX3jhBWEwGMTatWvFvn37xC233CISEhJEVVWV1GfYsGGie/fu4ueffxY//PCDaN++vRg/fry0vKSkRERGRooJEyaI/fv3i48//lj4+vqKd955R+qzY8cOoVKpxEsvvST++OMP8cwzzwgfHx/x+++/O237iouLRVpamlizZo04dOiQSE9PF/369RO9e/e2e424uDgxf/58u3164b9ZObfvctsohBCTJk0Sw4YNs6u/qKjIro+n7kMhhN125ebmiuXLlwuFQiGOHTsm9XHnfdiUzwVX/e101Ocpw40D9OvXT0yfPl16bjabRUxMjFi4cKGMVTVNQUGBACD+97//SW2DBg0SDz/88CXXWb9+vVAqlSIvL09qW7p0qdDr9aKmpkYIIcQTTzwhunbtarfeuHHjxNChQx27AReZM2eO6N69e4PLiouLhY+Pj/j000+ltoMHDwoAIj09XQjh3tt2KQ8//LBISkoSFotFCOHZ++/iDw6LxSKioqLEokWLpLbi4mKh1WrFxx9/LIQQ4o8//hAAxK+//ir12bBhg1AoFCInJ0cIIcSSJUtEcHCwtH1CCPHk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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "# 可视化损失曲线\n",
    "plt.plot(range(num_epochs), losses)\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('Training Loss over Epochs')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "yolov5",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
